#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
添加代码补全题目到数据库
"""

from app import create_app
from models import db, Problem
import json

def add_code_completion_problems():
    """添加代码补全题目"""
    app = create_app()
    
    with app.app_context():
        # 检查是否已存在代码补全题目
        existing = Problem.query.filter_by(type='code_completion').count()
        if existing > 0:
            print(f"已存在 {existing} 个代码补全题目，跳过添加")
            return
        
        # 代码补全题目数据
        problems_data = [
            {
                'title': 'Python函数补全',
                'description': '''请补全以下Python函数，使其能够计算两个数的和：

```python
def add_numbers(a, b):
    # 请在此处补全代码
    ___
    return result
```

要求：
1. 函数应该返回两个参数的和
2. 确保代码能够正确处理整数和浮点数
3. 函数名和参数名不能修改''',
                'type': 'code_completion',
                'difficulty': 'easy',
                'language': 'python',
                'answer': '''def add_numbers(a, b):
    # 请在此处补全代码
    result = a + b
    return result''',
                'test_cases': json.dumps([
                    {'input': '2\n3', 'output': '5'},
                    {'input': '1.5\n2.5', 'output': '4.0'},
                    {'input': '0\n0', 'output': '0'},
                    {'input': '-1\n1', 'output': '0'}
                ]),
                'points': 10,
                'time_limit': 1000,
                'memory_limit': 128,
                'created_by': 1,
                'status': 'active'
            },
            {
                'title': 'Java循环补全',
                'description': '''请补全以下Java代码，使其能够计算1到n的和：

```java
public class Solution {
    public static void main(String[] args) {
        int n = 10;
        int sum = 0;
        
        // 请在此处补全循环代码
        ___
        
        System.out.println(sum);
    }
}
```

要求：
1. 使用for循环计算1到n的和
2. 变量n和sum已经定义，不能修改
3. 输出结果应该是55（当n=10时）''',
                'type': 'code_completion',
                'difficulty': 'easy',
                'language': 'java',
                'answer': '''public class Solution {
    public static void main(String[] args) {
        int n = 10;
        int sum = 0;
        
        // 请在此处补全循环代码
        for (int i = 1; i <= n; i++) {
            sum += i;
        }
        
        System.out.println(sum);
    }
}''',
                'test_cases': json.dumps([
                    {'input': '10', 'output': '55'},
                    {'input': '5', 'output': '15'},
                    {'input': '1', 'output': '1'},
                    {'input': '100', 'output': '5050'}
                ]),
                'points': 15,
                'time_limit': 2000,
                'memory_limit': 128,
                'created_by': 1,
                'status': 'active'
            },
            {
                'title': 'C++数组查找',
                'description': '''请补全以下C++代码，实现数组中的最大值查找：

```cpp
#include <iostream>
using namespace std;

int findMax(int arr[], int size) {
    // 请在此处补全代码
    ___
}

int main() {
    int arr[] = {3, 7, 2, 9, 1, 5};
    int size = 6;
    cout << findMax(arr, size) << endl;
    return 0;
}
```

要求：
1. 实现findMax函数，返回数组中的最大值
2. 假设数组不为空且size > 0
3. 输出结果应该是9''',
                'type': 'code_completion',
                'difficulty': 'medium',
                'language': 'cpp',
                'answer': '''#include <iostream>
using namespace std;

int findMax(int arr[], int size) {
    // 请在此处补全代码
    int max = arr[0];
    for (int i = 1; i < size; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    return max;
}

int main() {
    int arr[] = {3, 7, 2, 9, 1, 5};
    int size = 6;
    cout << findMax(arr, size) << endl;
    return 0;
}''',
                'test_cases': json.dumps([
                    {'input': '', 'output': '9'},
                    {'input': '', 'output': '9'}
                ]),
                'points': 20,
                'time_limit': 2000,
                'memory_limit': 128,
                'created_by': 1,
                'status': 'active'
            },
            {
                'title': 'JavaScript字符串反转',
                'description': '''请补全以下JavaScript代码，实现字符串反转功能：

```javascript
function reverseString(str) {
    // 请在此处补全代码
    ___
}

// 测试代码
console.log(reverseString("hello"));
console.log(reverseString("world"));
```

要求：
1. 实现reverseString函数，返回反转后的字符串
2. 不能使用内置的reverse()方法
3. 输出结果应该是"olleh"和"dlrow"''',
                'type': 'code_completion',
                'difficulty': 'medium',
                'language': 'javascript',
                'answer': '''function reverseString(str) {
    // 请在此处补全代码
    let reversed = "";
    for (let i = str.length - 1; i >= 0; i--) {
        reversed += str[i];
    }
    return reversed;
}

// 测试代码
console.log(reverseString("hello"));
console.log(reverseString("world"));''',
                'test_cases': json.dumps([
                    {'input': '', 'output': 'olleh'},
                    {'input': '', 'output': 'dlrow'},
                    {'input': '', 'output': 'racecar'},
                    {'input': '', 'output': 'a'}
                ]),
                'points': 15,
                'time_limit': 1000,
                'memory_limit': 128,
                'created_by': 1,
                'status': 'active'
            },
            {
                'title': 'Python递归阶乘',
                'description': '''请补全以下Python代码，使用递归实现阶乘计算：

```python
def factorial(n):
    # 请在此处补全代码
    ___

# 测试代码
print(factorial(5))
print(factorial(0))
```

要求：
1. 实现factorial函数，使用递归计算n的阶乘
2. 注意处理边界情况（n=0时返回1）
3. 输出结果应该是120和1''',
                'type': 'code_completion',
                'difficulty': 'hard',
                'language': 'python',
                'answer': '''def factorial(n):
    # 请在此处补全代码
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)

# 测试代码
print(factorial(5))
print(factorial(0))''',
                'test_cases': json.dumps([
                    {'input': '', 'output': '120'},
                    {'input': '', 'output': '1'},
                    {'input': '', 'output': '1'},
                    {'input': '', 'output': '720'}
                ]),
                'points': 25,
                'time_limit': 2000,
                'memory_limit': 128,
                'created_by': 1,
                'status': 'active'
            }
        ]
        
        # 添加题目到数据库
        for problem_data in problems_data:
            problem = Problem(**problem_data)
            db.session.add(problem)
        
        try:
            db.session.commit()
            print(f"成功添加 {len(problems_data)} 个代码补全题目")
        except Exception as e:
            db.session.rollback()
            print(f"添加题目失败: {e}")

if __name__ == '__main__':
    add_code_completion_problems()
